/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.proyecto.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.controlador.MaterialControlador;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.proyecto.bean.SalidaProyecto;
import sv.com.intesal.proyecto.sql.SQLSalidaProyecto;
import sv.com.intesal.seguridad.bean.ParametroSicopi;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.ParametroSicopiControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author JM
 */
public class SalidaProyectoControlador {

    public void setEnca(SalidaProyecto sp, List<SalidaProyecto> listaSp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        SessionControlador sc = new SessionControlador();

        ParametroSicopiControlador pc = new ParametroSicopiControlador();
        ParametroSicopi pp = pc.getParametroSicopi("REQUISICION_PROYECTO");

        try {
            cnn = cConexion.conectar();
            if (sp.getId_sp() == null) {

                ps = cnn.prepareStatement(SQLSalidaProyecto.insertSalidaENCA);
                ps.setInt(1, sp.getId_e());
                ps.setInt(2, sp.getId_p());
                ps.setInt(3, sc.getCodigo_Usuario());
                ps.setDate(4, cVarios.getFecha(sp.getFecha_sp()));
                ps.setInt(5, pp.getCorrelativo_ps());
                ps.setInt(6, pp.getBloque_ps());
                ps.setString(7, sp.getObservacion_sp());
                ps.executeUpdate();

                ps.close();
                //cnn.close();

                //ACTUALIZAR NUMERO DE DOCUMENTO
                pc.updateCorrelativo("REQUISICION_PROYECTO");
                sp.setNumero_documento_sp(pp.getCorrelativo_ps());

            } else {

                ps = cnn.prepareStatement(SQLSalidaProyecto.insertSalidaENCA_Modificacion);
                ps.setInt(1, sp.getId_e());
                ps.setInt(2, sp.getId_p());
                ps.setDate(3, cVarios.getFecha(sp.getFecha_sp()));
                ps.setInt(4, sp.getNumero_documento_sp());
                ps.setString(5, sp.getObservacion_sp());
                ps.setInt(6, sp.getId_sp());
                ps.executeUpdate();

                ps.close();
                // cnn.close();
            }
            this.setDeta(sp, listaSp);

            Mensaje m = new Mensaje();
            if (sp.getId_sp() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }

    }

    public void setDeta(SalidaProyecto sp, List<SalidaProyecto> listaSp) throws Exception {

        try {
            Integer codigo_sp = sp.getId_sp();
            if (sp.getId_sp() == null) {
                codigo_sp = this.getMax();
                this.cambiarEstado("AC", codigo_sp);
            }

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listaSp.size(); i++) {
                if (listaSp.get(i).getId_d() == 0) {
                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLSalidaProyecto.insertSalidaDETA);

                    ps.setInt(1, listaSp.get(i).getId_dm());
                    ps.setInt(2, codigo_sp);
                    ps.setDouble(3, listaSp.get(i).getCantidad_d());
                    ps.executeUpdate();
                    ps.close();

                    //cnn.close();
                    mc.setCantidadMaterial_Aumentar_Disminuir(codigo_sp, listaSp.get(i).getId_dm(), listaSp.get(i).getCantidad_d(), "D", bc.ingresarSalidaProyecto + ": " + sp.getNumero_documento_sp(), sp.getNumero_documento_sp().toString(), bc.ingresarUtilizacionProyecto);
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLSalidaProyecto.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SalidaProyecto> getConsulta_SalidaProyecto(SalidaProyecto sp) throws Exception {

        List<SalidaProyecto> lista = new ArrayList<SalidaProyecto>();
        try {
            ResultSet rs = null;
            PreparedStatement ps = null;
            Connection cnn = null;

            cnn = cConexion.conectar();

            String var_estado = " and sp.estado_sp='AC' ";
            String var_fechas = this.getFiltro_Fechas(sp);
            String var_proyecto = " and p.id_p=" + sp.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + sp.getId_cl();

            if (sp.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }
            if (sp.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (sp.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT * FROM CLIENTE as cl, PROYECTO as p,SALIDA_PROYECTO as sp,EMPLEADO as e where e.id_e=sp.id_e and cl.id_c=p.id_c and p.id_p=sp.id_p " + var_estado + var_fechas + var_proyecto + var_cliente + " order by cl.id_c,sp.fecha_sp,sp.numero_documento_sp";
            //System.out.println("sql= " + sql);

            ps = cnn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                SalidaProyecto sP = new SalidaProyecto();

                /*SALIDA PROYECTO*/
                sP.setFecha_sp(rs.getDate("fecha_sp"));
                sP.setId_sp(rs.getInt("id_sp"));
                sP.setObservacion_sp(rs.getString("observacion_sp"));
                sP.setNumero_documento_sp(rs.getInt("numero_documento_sp"));
                sP.setBloque_sp(rs.getInt("bloque_sp"));
                sP.setFechahora(rs.getTimestamp("fechahora"));
                sP.setEstado_sp(rs.getString("estado_sp"));

                /*EMPELADO*/
                sP.setApellido_e(rs.getString("apellido_e"));
                sP.setNombre_e(rs.getString("nombre_e"));
                sP.setNombre_completo_e(rs.getString("nombre_e") + "  " + rs.getString("apellido_e"));
                sP.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                sP.setId_cl(rs.getInt("id_c"));
                sP.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                sP.setId_p(rs.getInt("id_p"));
                sP.setNombre_p(rs.getString("nombre_p"));
                lista.add(sP);
            }

            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SalidaProyecto> getDetaSalidaProyecto(Integer codigo_sp) throws Exception {

        List<SalidaProyecto> lista = new ArrayList<SalidaProyecto>();
        ResultSet rs = null;
        PreparedStatement ps = null;
        Connection cnn = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.getSalidaProyecto);
            ps.setInt(1, codigo_sp);
            rs = ps.executeQuery();

            while (rs.next()) {
                SalidaProyecto sp = new SalidaProyecto();
                /*DEVOLUCION PROYECTO*/
                sp.setFecha_sp(rs.getDate("fecha_sp"));
                sp.setId_sp(rs.getInt("id_sp"));
                sp.setObservacion_sp(rs.getString("observacion_sp"));
                sp.setNumero_documento_sp(rs.getInt("numero_documento_sp"));
                sp.setEstado_sp(rs.getString("estado_sp"));
                sp.setBloque_sp(rs.getInt("bloque_sp"));

                /*EMPLEADO*/
                sp.setApellido_e(rs.getString("apellido_e"));
                sp.setNombre_e(rs.getString("nombre_e"));
                sp.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                sp.setId_cl(rs.getInt("id_c"));
                sp.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                sp.setId_p(rs.getInt("id_p"));
                sp.setNombre_p(rs.getString("nombre_p"));

                /*DETA_DEVOLUCION*/
                sp.setId_dm(rs.getInt("id_dm"));
                sp.setId_d(rs.getInt("id_d"));
                sp.setCantidad_d(rs.getDouble("cantidad_d"));
                sp.setNombre_m(rs.getString("nombre_m"));

                /*MATERIAL*/
                lista.add(sp);
            }

            cnn.close();
            rs.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularSalidaProyecto(List<SalidaProyecto> listaSp) throws Exception {

        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listaSp.size(); i++) {
                mc.setCantidadMaterial_Aumentar_Disminuir(listaSp.get(0).getId_sp(), listaSp.get(i).getId_dm(), listaSp.get(i).getCantidad_d(), "A", bc.anulacionSalidaProyecto + ": " + listaSp.get(0).getNumero_documento_sp(), listaSp.get(0).getNumero_documento_sp().toString(), bc.anulacionSalidaProyecto);
            }
            bc.setBitacoraAnulacion(listaSp.get(0).getId_sp(), bc.anulacionSalidaProyecto + ": " + listaSp.get(0).getNumero_documento_sp(), bc.anulacionSalidaProyecto);
            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());
            this.cambiarEstado("A", listaSp.get(0).getId_sp());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarSalida(List<SalidaProyecto> listaSp) throws Exception {
        try {
            Boolean var_return = true;

            MaterialControlador mc = new MaterialControlador();
            Mensaje m = new Mensaje();
            for (int i = 0; i < listaSp.size(); i++) {
                if (mc.validar_cantidad(listaSp.get(i).getId_dm(), listaSp.get(i).getCantidad_d()) == false) {
                    m.messageAdvertencia(m.getIcantidad() + ": " + listaSp.get(i).getNombre_m());
                    var_return = false;
                }
            }
            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_ItemEliminarSalida(SalidaProyecto sp) throws Exception {

        try {
            MaterialControlador mc = new MaterialControlador();

            if (mc.validar_cantidad(sp.getId_dm(), sp.getCantidad_d()) == false) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public void cambiarEstado(String estado, Integer codigo_sp) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.cambiarEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_sp);
            ps.executeUpdate();

            ps.close();
            cnn.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void eliminarItem(SalidaProyecto sp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            //devolcion proyecto tiene el intento de roll back en la parte de eliminar ITEM. yo no se lo he puesto
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.setEliminarDeta);
            ps.setInt(1, sp.getId_d());
            ps.executeUpdate();

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            mc.setCantidadMaterial_Aumentar_Disminuir(sp.getId_sp(), sp.getId_dm(), sp.getCantidad_d(), "A", bc.eliminarItemSalidaProyecto + ": " + sp.getNumero_documento_sp(), sp.getNumero_documento_sp().toString(), bc.eliminarItemSalidaProyecto);
            bc.setBitacoraAnulacion(sp.getId_sp(), bc.eliminarItemSalidaProyecto + ": " + sp.getNumero_documento_sp(), bc.eliminarItemSalidaProyecto);

            ps.close();
            cnn.close();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public SalidaProyecto getEnca(Integer codigo_sp) throws Exception {
        /*OBTENER LA SALIDA DE PROYECTO CON UN SOLO CODIGO*/

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.getEncaSP);
            ps.setInt(1, codigo_sp);
            rs = ps.executeQuery();
            rs.next();

            SalidaProyecto sp = new SalidaProyecto();

            sp.setId_sp(rs.getInt("id_sp"));
            sp.setId_e(rs.getInt("id_e"));
            sp.setId_p(rs.getInt("id_p"));

            sp.setId_u(rs.getInt("id_u"));
            sp.setFecha_sp(rs.getDate("fecha_sp"));
            sp.setFechahora(rs.getTimestamp("fechahora"));

            sp.setObservacion_sp(rs.getString("observacion_sp"));
            sp.setEstado_sp(rs.getString("estado_sp"));
            sp.setNumero_documento_sp(rs.getInt("numero_documento_sp"));
            sp.setBloque_sp(rs.getInt("bloque_sp"));

            cnn.close();
            ps.close();
            rs.close();

            return sp;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SalidaProyecto> getDeta(Integer codigo_sp) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            List<SalidaProyecto> lista = new ArrayList<SalidaProyecto>();

            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.getDetaSP);
            ps.setInt(1, codigo_sp);
            rs = ps.executeQuery();

            while (rs.next()) {
                SalidaProyecto sp = new SalidaProyecto();
                sp.setId_d(rs.getInt("id_d"));
                sp.setId_dm(rs.getInt("id_dm"));

                sp.setNombre_m(rs.getString("nombre_m"));
                sp.setCantidad_d(rs.getDouble("cantidad_d"));
                lista.add(sp);
            }
            rs.close();
            cnn.close();
            ps.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarSalidaProyecto(SalidaProyecto sp) throws Exception {

        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(sp.getId_sp(), RutaProyecto.wfrmSalidaProyecto);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<SalidaProyecto> getSalidaProyecto_x_Proyecto(Integer codigo_p) throws Exception {

        List<SalidaProyecto> lista = new ArrayList<SalidaProyecto>();

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLSalidaProyecto.getEncaSP_x_Proyecto);
            ps.setInt(1, codigo_p);
            rs = ps.executeQuery();

            while (rs.next()) {
                SalidaProyecto sP = new SalidaProyecto();

                /*SALIDA PROYECTO*/
                sP.setFecha_sp(rs.getDate("fecha_sp"));
                sP.setId_sp(rs.getInt("id_sp"));
                sP.setObservacion_sp(rs.getString("observacion_sp"));
                sP.setNumero_documento_sp(rs.getInt("numero_documento_sp"));
                sP.setBloque_sp(rs.getInt("bloque_sp"));
                sP.setFechahora(rs.getTimestamp("fechahora"));
                sP.setEstado_sp(rs.getString("estado_sp"));

                /*EMPELADO*/
                sP.setApellido_e(rs.getString("apellido_e"));
                sP.setNombre_e(rs.getString("nombre_e"));
                sP.setNombre_completo_e(rs.getString("nombre_e") + "  " + rs.getString("apellido_e"));
                sP.setId_e(rs.getInt("id_e"));

                /*CLIENTE*/
                sP.setId_cl(rs.getInt("id_c"));
                sP.setEmpresa_cl(rs.getString("empresa_c"));

                /*PROYECTO*/
                sP.setId_p(rs.getInt("id_p"));
                sP.setNombre_p(rs.getString("nombre_p"));

                lista.add(sP);
            }
            cnn.close();
            ps.close();
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(SalidaProyecto sp) throws Exception{
        try {
            String var_fechas = " ";
            if (sp.getFecha_i() != null && sp.getFecha_f() == null) {
                var_fechas = " and sp.fecha_sp >='" + cVarios.getFecha(sp.getFecha_i()) + "' ";
            } else if (sp.getFecha_f() != null && sp.getFecha_i() == null) {
                var_fechas = " and sp.fecha_sp <='" + cVarios.getFecha(sp.getFecha_f()) + "' ";
            } else if (sp.getFecha_i() == null && sp.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and sp.fecha_sp between '" + cVarios.getFecha(sp.getFecha_i()) + "' and '" + cVarios.getFecha(sp.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*REPORTES*/
    public void generarReporte_Detalle(SalidaProyecto sp) throws Exception {
        /*GENERAR REPROTE PARA UNA DEVOLUCION DE PROYECTO.*/
        try {

            String sql = "SELECT s.nombre_s,p.nombre_p,cl.empresa_c,cl.registro_c,cl.nit_c,cl.giro_c,p.descripcion_p,p.direccion_p,p.fecha_inicio_p,p.fecha_finalizacion_p,sp.fecha_sp,sp.fechahora,sp.observacion_sp,sp.bloque_sp,sp.numero_documento_sp,m.nombre_m,m.codigo_barra_m,d.cantidad_d, (e.nombre_e || ' ' || e.apellido_e) nombre,tc.nombre_tc,tp.nombre_tp FROM CLIENTE as cl, PROYECTO as p,SALIDA_PROYECTO as sp,DETA_SALIDA_PROYECTO as d,EMPLEADO as e,MATERIAL_SUCURSAL as ms,MATERIAL as m,TIPO_PROYECTO as tp,TIPO_CLIENTE as tc,SUCURSAL as s where m.id_m=ms.id_m and ms.id_dm=d.id_dm and e.id_e=sp.id_e and cl.id_c=p.id_c and tp.id_tp=p.id_tp and tc.id_tc=cl.id_tc and p.id_p=sp.id_p and sp.id_sp=d.id_sp  and s.codigo_s=ms.codigo_s "
                    + " and sp.id_sp=" + sp.getId_sp() + " order by cl.id_c,sp.fecha_sp,sp.numero_documento_sp";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Enca(SalidaProyecto sp) throws Exception {
        try {
            String var_estado = " and sp.estado_sp='AC' ";
            String var_fechas = this.getFiltro_Fechas(sp);
            String var_proyecto = " and p.id_p=" + sp.getId_p() + " ";
            String var_cliente = " and cl.id_c=" + sp.getId_cl();

            if (sp.getId_p() == null) {
                var_proyecto = " ";//trae todos los proyectos.
            }
            if (sp.getId_cl() == null) {
                var_cliente = " ";
            }
            var_cliente = " ";
            String sql = "SELECT * FROM CLIENTE as cl, PROYECTO as p,SALIDA_PROYECTO as sp,EMPLEADO as e where e.id_e=sp.id_e and cl.id_c=p.id_c and p.id_p=sp.id_p "
                    + var_estado + var_fechas + var_proyecto + var_cliente + " order by cl.id_c,sp.fecha_sp,sp.numero_documento_sp";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
